在Github上下载了Spring Boot 的源码后,折腾了我几天才终于把这货给编译成功,并成功build出IDEA的project出来了,官方埋坑真的是天理不容啊。
我下载的是spring boot 2.1.8,下载后照着网上的文章执行指令:mvnw clean install -DskipTests -Pfast
然后就是半天动都不动,也不知道发生了什么。后面我就加多了个debug日志输出, 还是什么都没有输出。。。
搜了一下 mvnw,原来这家伙全名maven wrapper,它的原理是在maven-wrapper.properties文件中记录你要使用的maven版本,当用户执行mvnw clean 命令时,发现当前用户的maven版本和期望的版本不一致,那么就下载期望的版本,然后用期望的版本来执行mvn命令。也就是这个东西有两个作用,一个是不需要你事先安装maven,一个是保证你build的时候使用的maven保持一致。
后来看到这篇文章《学Spring Boot不能装! 🤣不装Maven、Database、Tomcat 才是正常开发模式》,原来mvnw第一次运行会检测$USER_HOME/.m2/wrapper/dists 目录下是否有maven-wrapper.properties中指定的Maven版本,如果没有就自动下载。比如我用的windows,就在目录C:\Users\shahuwang\.m2\wrapper\dists
里有一个apache-maven-3.5.4-bin(刚才执行mvnw时生成的),继续打开,来到目录C:\Users\shahuwang\.m2\wrapper\dists\apache-maven-3.5.4-bin\4lcg54ki11c6mp435njk296gm5
然后在里面看到下载了部分的maven。
mvn那样下载的方式特别特别慢,所以我直接用浏览器下载对应版本的maven,https://archive.apache.org/di... 3.5.4-bin.zip,然后放到C:\Users\shahuwang\.m2\wrapper\dists\apache-maven-3.5.4-bin\4lcg54ki11c6mp435njk296gm5
里即解决问题。注意一定要版本一致,且为zip包。
另外,要注意修改C:\Users\shahuwang\.m2
下maven的setting.xml,把官方源修改为阿里云的源,不然会慢到死的。
搞定后,继续执行mvnw clean install -DskipTests -Pfast
,中间发现有几次failed,都是继续再执行命令就解决了,看起来应该是网络连接中断的问题,之前网上一直找也没找到解决方案,没想到就是build多几次就解决了。
后面又遇到一个格式化的问题,mvnw spring-javaformat:apply
这个命令就解决了。
最后执行 mvnw idea:idea
创建 IDEA 项目。
然后就遇到了checkstyle的问题,spring boot定义了一个nohttp的规则,不能用http域名,除非在白名单里面。但是呢,它自己的文档里apache.org 这个域名用了http,又没有放到白名单里,然后一直编译都通过不了,只是告诉我违反了规则,又没有告诉我哪里错了。最后,终于搞清楚checkstyle的输出,是放在主目录下target/checkstyle-result.xml 里面,找到里面的error,就知道是哪里的问题了。
最坑爹的是,上述问题我解决了之后,重新下载全新的spring boot工程,执行mvnw clean install -DskipTests -Pfast
就一下子通过了,上述问题全部都没有遇到,也难怪我搜索半天也找不到解决方案了,看起来maven还是不太行。
最后的最后,又发现一个新的坑,生成了IDEA项目之后,发现默认的Language Level 就是 Java 5,这哪里受得了呀。网上找到的方法都是加这么一段:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
经我验证是行不通的,spring boot下面有很多的modules,上面这样写,要逐个module下的pom.xml去修改,太烦人了。最终在这个问答下找到了解决方案,要使用properties的方式,直接在主目录下的pom.xml 下添加:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
properties是仅次于project的二级目录,一般情况下都会有的,把中间那两行放进去就行了。之后就完美解决问题了,自动使用java 11了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。